package cn.com.cym.gamezao.base;

import org.springframework.data.domain.Page;
import org.springframework.lang.NonNull;

import java.util.List;
import java.util.Optional;

public interface BaseService<T extends BaseEntity> {
    /**
     * 根据id获取实体
     * @param id id
     * @return t
     */
    T fetchOne(@NonNull Long id);



    /**
     * 分页查询，带有查询条件
     * @param searchDto searchDto
     * @return Page
     */
    Page<T> findByPageable(SearchPage searchDto);


    /**
     * 分页查询
     * @param searchDto searchDto
     * @return Page
     */
    Page<T> findByPageableDemo(SearchPage searchDto);

    /**
     * 保存
     * @param t t
     * @return t
     */
    T save(T t);

    /**
     * 更新
     * @param t t
     * @param id id
     * @return t
     */
    T update(@NonNull T t,@NonNull Long id);

    /**
     * 根据id 物理删除
     * @param id id
     */
    int physicalDelete(@NonNull Long id);


    /**
     * 批量删除
     * @param ids
     * @return
     */
    int physicalDeleteByIds(List<Long> ids);

    /**
     * 根据id 逻辑删除
     * @param id id
     * @return int
     */
    int logicDelete(@NonNull Long id);

    /**
     * 根据id查找数据
     * @param id id
     * @return optional
     */
    Optional<T> fetchById(@NonNull Long id);

    /**
     * 获取所有数据
     * @return list
     */
    List<T> getAll();


    /**
     * 获取所有可视数据（排除逻辑删除数据）
     * @return
     */
    List<T> getAllVisible();


    /**
     * 批量删除数据
     * @param ids
     * @return
     */
    int deleteIds(List<Long> ids,boolean logic);
}
